home *** CD-ROM | disk | FTP | other *** search
- /* @(#)fix31.c, Dirk Haun, Mai/Juli 1995
- * @(#)einfaches xFSL-Testprogramm für fix31-Modus
- *
- * Das Programm zeigt, wie man einen Fontselektor über die xFSL-Schnittstelle
- * aufruft. Die übergebene xFSL_PAR-Struktur dient dabei der Ein- und Ausgabe.
- *
- * Die benötigten Informationen über den ausgewählten Font stehen hinterher in
- * xpar.font, d.h. in der PFONTINFO-Struktur innerhalb der xFSL_PAR-Struktur.
- *
- * Der Fontselektor wird hierbei im fix31-Modus aufgerufen, sofern er dies
- * unterstützt.
- *
- * Da es sich nur um ein Demo-Programm handelt, das mit dem ausgewählten Font
- * nichts weiter anfängt, wird auf das Öffnen einer VDI-Workstation und das
- * Nachladen der Fonts mit vst_load_fonts() verzichtet.
- *
- * Bugs: Der Aufruf der Hilfe (ST-Guide) funktioniert so nicht mit Memory
- * Protection.
- */
-
- #include <stdio.h>
- #include <aes.h>
- #include <vdi.h>
- #include <string.h>
- #include <xfsl.h>
-
- #ifndef FALSE
- # define FALSE (0)
- # define TRUE (1)
- #endif
-
- #define VA_START 0x4711
-
- extern int get_cookie(long cookie,long *val);
- extern fix31 pt2fix(int pt);
- extern int fix2pt(fix31 f);
-
- void error(int e)
- {
- switch(e)
- {
- case xFS_PARERROR : form_alert(1,"[2][Fehler in den übergebenen|Parametern!][Abbruch]");
- break;
- case xFS_LOADERROR : form_alert(1,"[2][Fehler beim Nachladen|von XFSL.OVL!][Abbruch]");
- break;
- case xFS_RES_ERROR : form_alert(1,"[2][Auflösung zu gering!][Abbruch]");
- break;
- case xFS_NO_HANDLE : form_alert(1,"[2][Kein Handle frei!][Abbruch]");
- break;
- case xFS_NO_WINDOW : form_alert(1,"[2][Kein Fenster frei!][Abbruch]");
- break;
- case xFS_NO_FONTS : form_alert(1,"[2][Keine Fonts geladen!][Abbruch]");
- break;
- case xFS_NO_FONTSIZE: form_alert(1,"[2][Fontgröße konnte nicht|identifiziert werden!][Abbruch]");
- break;
- case xFS_ACTIVE : form_alert(1,"[2][Fontselektor ist bereits aktiv!][Abbruch]");
- break;
- case xFS_ERROR : form_alert(1,"[2][Speichermangel!][Abbruch]");
- break;
- default : if(e<0) form_error(-31-e); /* Gemdos-Fehlermeldung */
- }
- }
-
- void appl_pwrite(int apid,...)
- {
- int i, msg[8];
- va_list pp;
-
- va_start(pp,apid);
- for(i=0;i<8;i++) msg[i]=va_arg(pp,int);
- appl_write(apid,16,msg);
- va_end(pp);
- }
-
- void main(void)
- {
- int ret, xhandle, stg, gl_apid, again, vork;
- char fontname[40], alert[128], transfer[256];
- long features, nachk;
- char *cp;
- EVENT ev;
- xFSL *xfsl;
- xFSL_PAR xpar;
- PFONTINFO pfont;
-
- gl_apid=appl_init();
- if(get_cookie('xFSL',(long*)&xfsl))
- {
- features=xfsl->xfsl_info();
- if((features&XF_FIX31)==0)
- form_alert(1,"[1][Der xFSL-Selektor unterstützt |keine fix31-Angaben! ][ Schade ]");
-
-
- /* Vorbereitungen
- */
- memset(&xpar,0,sizeof(xFSL_PAR)); /* Strukturen "ausnullen" */
- memset(&pfont,0,sizeof(PFONTINFO));
-
- xpar.par_size=(int)sizeof(xFSL_PAR); /* Strukturgrößen eintragen */
- xpar.pfi_size=(int)sizeof(PFONTINFO);
- xpar.font=&pfont; /* Zeiger auf Fontinfo eintragen */
-
- xpar.control|=CC_WINDOW; /* xFSL als Fenster */
- if(features&XF_FIX31) xpar.control|=CC_FIX31;
- xpar.headline="Wählen Sie einen Font!"; /* Überschrift */
- xpar.example="Jetzt aber fix!"; /* Beispieltext */
- xpar.helptext="HILFE"; /* Text für Hilfe-Button */
- xpar.fontflags=FF_VEKTOR; /* nur Vektorfonts zur Auswahl stellen */
- fontname[0]='\0';
- xpar.font->fontname=fontname;
- xpar.font->fontcol=BLACK;
-
-
- /* Jetzt kann's losgehen
- */
- do
- {
- again=FALSE;
-
- xhandle=xfsl->xfsl_init(0,&xpar); /* Dialog darstellen, Handle zurückgeben */
-
- if(xhandle==xFS_NO_WINDOW) /* Kein Fenster frei? Dann als modaler Dialog */
- {
- xpar.control&=~CC_WINDOW;
- xhandle=xfsl->xfsl_init(0,&xpar);
- }
-
- if(xhandle>=0) /* gültiges Handle? */
- {
- do
- {
- ev.ev_mflags=0;
- ret=xfsl->xfsl_event(xhandle,&ev);
- if(ret==xFS_HELP && xpar.helpinfo) /* Hilfe aufrufen */
- {
- stg=appl_find("ST-GUIDE");
- if(stg>0)
- {
- cp=strchr(xpar.helpinfo,',');
- if(cp)
- {
- strcpy(transfer,"*:\\");
- strncat(transfer,xpar.helpinfo,(int)(cp-xpar.helpinfo));
- strcat(transfer,".hyp ");
- strcat(transfer,cp+1);
- appl_pwrite(stg,VA_START,gl_apid,0,transfer,0,0,0);
- }
- }
- else form_alert(1,"[2][Keine Hilfe verfügbar! ][ Pech ]");
- }
- }
- while(ret!=xFS_OK && ret!=xFS_STOP); /* bis "OK" oder "Abbruch" gewählt */
- xfsl->xfsl_exit(xhandle); /* Dialog abmelden */
- if(ret<0) error(ret);
- else if(ret==xFS_OK)
- {
- vork=(int)(xpar.font->fontsize.size31>>16); /* Vorkomma-Anteil */
- nachk=(xpar.font->fontsize.size31&0xffff); /* Nachkomma-Anteil */
- nachk*=100; nachk+=49; nachk/=65536L; /* ... auf zwei Stellen runden */
-
- sprintf(alert,"[1][Ausgewählt wurde der|Font mit ID %u|in der Größe %d.%d pt|(gerundet: %d pt).][ Nochmal | Abbruch ]"
- ,xpar.font->fontid,vork,(int)nachk,fix2pt(xpar.font->fontsize.size31));
- if(form_alert(1,alert)==1) again=TRUE;
- }
- }
- else error(xhandle);
- }
- while(again);
-
- }
- else form_alert(1,"[2][Sorry, kein xFSL-Cookie vorhanden. ][ Abbruch ]");
- appl_exit();
- }
-